﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Follow.Model;
using Follow.DataAccess;
using Follow.Common;

namespace Follow.Business
{
    public class UsuarioBO
    {
        public IList<Usuario> findAll()
        {
            UsuarioDAO dao = new UsuarioDAO();
            return dao.findAll();
        }

        public IList<Usuario> findByGrupo(Int32 id)
        {
            UsuarioDAO dao = new UsuarioDAO();
            return dao.findByGrupo(id);
        }

        public IList<Usuario> findByName(String nome)
        {
            UsuarioDAO dao = new UsuarioDAO();
            return dao.findByName(nome);
        }

        public void save(Usuario usuario, Int32 idUsuario)
        {
            UsuarioDAO dao = new UsuarioDAO();

            validate(usuario);

            if (usuario.IDUsuario == Int32.MinValue || usuario.IDUsuario.Equals(0))
            {
                dao.insert(usuario, idUsuario);
            }
            else
            {
                dao.update(usuario, idUsuario);
            }
        }

        public Usuario load(Int32 idusuarioID)
        {
            UsuarioDAO dao = new UsuarioDAO();
            return dao.findById(idusuarioID);
        }

        public void validate(Usuario usuario)
        {
            if (String.IsNullOrEmpty(usuario.Nome))
            {
                throw new Exception("O campo nome é obrigatório.");
            }

            if (String.IsNullOrEmpty(usuario.Login))
            {
                throw new Exception("O campo login é obrigatório.");
            }

            if (String.IsNullOrEmpty(usuario.Senha))
            {
                throw new Exception("O campo senha é obrigatório.");
            }

            if (String.IsNullOrEmpty(usuario.Email))
            {
                throw new Exception("O campo e-mail é obrigatório.");
            }

            if (usuario.IDGrupo.Equals(0) || usuario.IDGrupo == Int32.MinValue)
            {
                throw new Exception("O campo grupo é obrigatório.");
            }
        }

        public void delete(Int32 id, Int32 idUsuario)
        {
            UsuarioDAO dao = new UsuarioDAO();
            validarExclusao(id);
            dao.delete(id, idUsuario);
        }

        public void validarExclusao(Int32 id)
        {
            FuncionarioDAO dao = new FuncionarioDAO();
            Funcionario f = dao.findByIdUsuario(id);

            if (f != null)
            {
                throw new Exception("Esse usuário não pode ser excluído. Ele está relacionado a um funcionário.");
            }
        }

        public Usuario authenticate(String login, String senha)
        {
            this.validarLogin(login, senha);

            UsuarioDAO dao = new UsuarioDAO();
            IList<Usuario> user = dao.findByLogin(login, senha);
            if (user == null || user.Count.Equals(0))
            {
                Model.Usuario cls = new Model.Usuario();

                cls.IDUsuario = 0;
                cls.IDGrupo = 0;
                cls.Nome = "";
                cls.Login = "";
                cls.Email = "";
                cls.Senha = "";

                return cls;

                //throw new Exception("Usuário ou senha inválida.");
            }
            else
            {
                return user[0];
            }
        }

        public void validarLogin(String login, String senha)
        {
            if (String.IsNullOrEmpty(login))
            {
                throw new Exception("O campo login é obrigatório.");
            }
            if (String.IsNullOrEmpty(senha))
            {
                throw new Exception("O campo senha é obrigatório.");
            }
        }
    }
}